﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using JPSOFTWARE.BON.DAL;
using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Modelos.Interfaces;
using System.Data.Common;

namespace JPSOFTWARE.BON.DAL
{
    public class UsuarioDAL : BaseDAL, IUsuario
    {
        dbBONDataContext dbBON = null;

        public UsuarioDAL()
        {
            dbBON = new dbBONDataContext(StringConexao());
        }

        public bool RegistrarUsuario(UsuarioRegistrarModel registrarUsuario)
        {
            bool retorno = false;

            DbTransaction transacao = null;

            try
            {                
                dbBON.Connection.Open();
                transacao = dbBON.Connection.BeginTransaction();
                dbBON.Transaction = transacao;

                TBL_USUARIO tblusuario = new TBL_USUARIO();

                tblusuario.NM_USUARIO = registrarUsuario.Nome;
                tblusuario.DS_EMAIL = registrarUsuario.Email;
                tblusuario.DS_SENHA = Criptografia.Criptografar(registrarUsuario.Senha);
                tblusuario.ST_ATIVADO = false;
                tblusuario.ST_ATIVO = true;
                tblusuario.DT_ALTERACAO = DateTime.Now;
                tblusuario.COD_TIPO_USUARIO = (int)TipoUsuarioModel.Usuario;
                tblusuario.NM_APLICACAO = "Bebida Social";

                dbBON.TBL_USUARIOs.InsertOnSubmit(tblusuario);
                dbBON.SubmitChanges();

                //TBL_USUARIO_REGRA tblUsuarioRegra = new TBL_USUARIO_REGRA();

                //tblUsuarioRegra.COD_REGRA = (int)RegraUsuarioModel.Distribuidora;
                //tblUsuarioRegra.COD_USUARIO = tblusuario.COD_USUARIO;


                //dbBON.TBL_USUARIO_REGRAs.InsertOnSubmit(tblUsuarioRegra);
                //dbBON.SubmitChanges();

                transacao.Commit();

                retorno = true;

            }
            catch (Exception ex)
            {
                if (transacao != null)
                {
                    transacao.Rollback();
                    throw ex;
                }
            }
            finally
            {
                dbBON.Connection.Close();
            }
            return retorno;
        }

        public List<UsuarioView> ListarUsuarioView(int IdUsuario)
        {
            List<UsuarioView> lista = new List<UsuarioView>();
            UsuarioView usuarioView;

            try
            {
                var consulta = dbBON.TBL_USUARIOs.Where(X => X.COD_USUARIO == IdUsuario).ToList();

                foreach (var item in consulta)
                {
                    usuarioView = new UsuarioView()
                    {
                        IdUsuario = item.COD_USUARIO,
                        Nome = item.NM_USUARIO,
                        Email = item.DS_EMAIL,
                        Status = item.ST_ATIVO == true ? "Ativo" : "Inativo",
                        DataAlteracao = (DateTime)item.DT_ALTERACAO,
                        TipoUsuario = item.COD_TIPO_USUARIO == (int)TipoUsuarioModel.Usuario ? "Usuario" : "Administrador"
                    };
                    lista.Add(usuarioView);
                };
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return lista;
        }

        public List<UsuarioView> ListarUsuariosView()
        {
            List<UsuarioView> lista = new List<UsuarioView>();
            UsuarioView usuarioView;

            try
            {
                var consulta = dbBON.TBL_USUARIOs.OrderBy(x => x.DS_EMAIL).ToList();

                foreach (var item in consulta)
                {
                    usuarioView = new UsuarioView()
                    {
                        IdUsuario = item.COD_USUARIO,
                        Nome = item.NM_USUARIO,
                        Email = item.DS_EMAIL,
                        Status = item.ST_ATIVO == true ? "Ativo" : "Inativo",
                        DataAlteracao = (DateTime)item.DT_ALTERACAO,
                        TipoUsuario = item.COD_TIPO_USUARIO == 1 ? "Admistrador" : "Usuário"
                    };
                    lista.Add(usuarioView);
                };
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return lista;
        }

        public List<UsuarioView> ListarUsuariosAdministradorView()
        {
            List<UsuarioView> lista = new List<UsuarioView>();
            UsuarioView usuarioView;

            try
            {
                var consulta = dbBON.TBL_USUARIOs.Where(p => p.COD_TIPO_USUARIO == (int)TipoUsuarioModel.Administrador && p.ST_ATIVADO.Equals(true) && p.ST_ATIVO.Equals(true)).ToList();

                foreach (var item in consulta)
                {
                    usuarioView = new UsuarioView()
                    {
                        IdUsuario = item.COD_USUARIO,
                        Nome = item.NM_USUARIO,
                        Email = item.DS_EMAIL,
                        Status = item.ST_ATIVO == true ? "Ativo" : "Inativo",
                        DataAlteracao = (DateTime)item.DT_ALTERACAO,
                        TipoUsuario = item.COD_TIPO_USUARIO == 1 ? "Admistrador" : "Usuário"
                    };
                    lista.Add(usuarioView);
                };
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return lista;
        }

        public bool VerificarSenhaUsuario(int IdUsuario, string senhaUsuario)
        {
            bool retorno = false;

            string senhaUsuarioCriptografada = Criptografia.Criptografar(senhaUsuario);

            try
            {
                var consulta = dbBON.TBL_USUARIOs.Where(C => C.COD_USUARIO == IdUsuario && C.DS_SENHA == senhaUsuarioCriptografada).FirstOrDefault();

                if (consulta == null)
                {
                    return retorno;
                }
                else
                {
                    retorno = true;
                }
                return retorno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        public UsuarioDistribuidoraModel DistribuidoraPorUsuario(int IdUsuario)
        {
            UsuarioDistribuidoraModel usuarioDistribuidoraModel = new UsuarioDistribuidoraModel();

            try
            {
                var consulta = (dbBON.TBL_DISTRIBUIDORAs.FirstOrDefault(x => x.COD_USUARIO == IdUsuario));

                if (consulta != null)
                {
                    usuarioDistribuidoraModel.IdDistribuidora = consulta.COD_DISTRIBUIDORA;
                    usuarioDistribuidoraModel.IdUsuario = consulta.COD_USUARIO;
                }
            }
            catch (Exception)
            {
                throw;
            }
            return usuarioDistribuidoraModel;
        }

        public bool VerificaSeExisteEmail(string email)
        {
            bool retorno = false;

            try
            {
                var consulta = dbBON.TBL_USUARIOs.Where(C => C.DS_EMAIL == email).FirstOrDefault();

                if (consulta == null)
                {
                    return retorno;
                }
                else
                {
                    retorno = true;
                }
                return retorno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public UsuarioEditarModel EditarUsuario(int IdUsuario)
        {
            UsuarioEditarModel editarModel = new UsuarioEditarModel();

            try
            {
                var consulta = dbBON.TBL_USUARIOs.FirstOrDefault(X => X.COD_USUARIO == IdUsuario);

                if (consulta != null)
                {
                    editarModel = new UsuarioEditarModel
                    {
                        IdUsuario = consulta.COD_USUARIO,
                        Nome = consulta.NM_USUARIO,
                        Email = consulta.DS_EMAIL,
                        Status = consulta.ST_ATIVO,
                        TipoUsuario = consulta.COD_TIPO_USUARIO,
                        DataAlteracao = consulta.DT_ALTERACAO,
                    };
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return editarModel;
        }

        public bool EditarUsuario(UsuarioEditarModel editarModel)
        {
            bool retorno = false;

            try
            {
                TBL_USUARIO tbUsuario = dbBON.TBL_USUARIOs.Where(X => X.COD_USUARIO == editarModel.IdUsuario).FirstOrDefault();

                tbUsuario.COD_USUARIO = editarModel.IdUsuario;
                tbUsuario.NM_USUARIO = editarModel.Nome;
                tbUsuario.DS_EMAIL = editarModel.Email;
                tbUsuario.ST_ATIVO = editarModel.Status;
                tbUsuario.COD_TIPO_USUARIO = editarModel.TipoUsuario;
                tbUsuario.DT_ALTERACAO = DateTime.Now;

                dbBON.SubmitChanges();

                retorno = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }

        /// <summary>
        /// Verifica se é o primeiro registro na tabela de usuários ele é automaticamente classificado como administrador
        /// </summary>
        /// <returns></returns>
        public void VerificaSePrimeiroRegistro()
        {
            try
            {
                var consulta = dbBON.TBL_USUARIOs.ToList();


                if (consulta.Count == 1)
                {
                    foreach (var item in consulta)
                    {
                        item.COD_TIPO_USUARIO = 1;
                    }

                    dbBON.SubmitChanges();

					//var usuarioRegra = dbBON.TBL_USUARIO_REGRAs.ToList();

					//foreach (var item in usuarioRegra)
					//{
					//    item.COD_REGRA = 1;
					//}
					//dbBON.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
